package cn.gwm.flink.streaming.dwm.charge.util;

import cn.gwm.flink.streaming.client.RedisClient;
import cn.gwm.flink.streaming.constant.BaseFields;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @ClassName LastTripTimeUtil
 * @Description 上一个行程时间获取
 * @Author LiangGuang
 * @Date 2023/03/24 10:47
 */
public class LastTripTimeUtil {
    /**
     * redis中 关于行程的key设置
     */
    private static final String REDIS_TRIP = "DWM_TRIP_TOTAL";
    /**
     * 72小时内行程可信任
     */
    private static final Integer LONG_TIME = 72;

    /**
     * 根据vin 获取行程并进行排序
     *
     * @param vin
     * @return
     */
    public static List<JSONObject> reloadTrip(String vin) {
        List<String> lrange = RedisClient.lrange(REDIS_TRIP + vin);

        List<JSONObject> result = new ArrayList<>();
        if (lrange.size() > 0) {

            lrange.stream().map(JSONUtil::parseObj).filter(item -> item.containsKey(BaseFields.tid)).sorted((t1, t2) -> {
                return DateUtil.parse(t1.getStr(BaseFields.tid), DatePattern.NORM_DATETIME_PATTERN).getTime() - DateUtil.parse(t2.getStr(BaseFields.tid), DatePattern.NORM_DATETIME_PATTERN).getTime() > 0 ? 1 : -1;
            }).forEach(item -> {
                result.add(item);
            });
        }
        return result;
    }

    /**
     * 获取当前时间前一个行程时间 并 经纬度信息
     *
     * @param nowTime
     * @param tripList
     * @return
     */
    public static JSONObject lastTrip(Long nowTime, List<JSONObject> tripList) {
        JSONObject lastTrip = JSONUtil.createObj();
        for (JSONObject trip : tripList) {
            Long tripTime = trip.getLong(BaseFields.tid);
            if (tripTime > nowTime) {
                break;
            }
            if (tripTime <= nowTime) {
                // flag 大行程开始结束  是1的时候是结束 0是开始 你只用是1的
                if (trip.containsKey("flag") && 1 == trip.getInt("flag")) {
                    lastTrip = trip;
                }
            }
        }
        // 判断 时间是否在72小时之内，如果不在则舍弃
        if (lastTrip.size() > 0) {
            DateTime parse = DateUtil.parse(lastTrip.getStr(BaseFields.tid), DatePattern.NORM_DATETIME_PATTERN);
            if (parse.offset(DateField.HOUR, LONG_TIME).before(DateUtil.date(nowTime))) {
                // 不可信
                lastTrip = JSONUtil.createObj();
            }
        }
        return lastTrip;
    }


}
